package com.t14;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by xuyiwei on 2018/8/11.
 */
class DynamicProxyHandler implements InvocationHandler{
    private Object proxied;
    public DynamicProxyHandler(Object targetObject) {
        this.proxied=targetObject;
    }
//    public Object newProxyInstance(Object targetObject){
//        return Proxy.newProxyInstance(targetObject.getClass().getSuperclass().getInterfaces().getClass().getClassLoader(),
//                new Class<?>[] {targetObject.getClass().getSuperclass().getInterfaces().getClass()}, new DynamicProxyHandler(targetObject));
//    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("start-->>");
        Object ret=null;
        try{
            //调用目标方法  这里的不是proxy对象  还是主动传递进去的对象保险
            //调用方法传递进来的proxy对象会报错死机  原因不明
            ret=method.invoke(proxied, args);
			/*原对象方法调用后处理日志信息*/
            System.out.println("success-->>");
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("error-->>");
            throw e;
        }
        //这里是返回值，方法最终执行的返回值
        return ret;
    }
}
public class SimpleDynamicProxy {
    public static void main(String[] args) {
        RealObject real = new RealObject();
        //这里传递进去三个传递进去三个参数  一个是接口的类加载器 一个是接口类  一个是代理类的引用
        Interface in  = (Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(),
                new Class<?>[] {Interface.class},
                new DynamicProxyHandler(real));
        in.doSomething();
    }
}
